/**
 * 全局错误处理器
 * 捕获未处理的Promise rejection和Vue错误
 */
import { Message } from 'element-ui'

/**
 * Vue 错误处理器
 * 捕获组件渲染和生命周期钩子中的错误
 */
export function vueErrorHandler(err, vm, info) {
  console.error('Vue Error:', err)
  console.error('Component:', vm)
  console.error('Error Info:', info)
  
  let message = '页面渲染出错，请刷新页面重试'
  
  // 根据错误类型提供更友好的提示
  if (err.message) {
    if (err.message.includes('Cannot read property')) {
      message = '数据加载失败，请刷新页面'
    } else if (err.message.includes('undefined is not an object')) {
      message = '数据错误，请刷新页面'
    } else if (err.message.includes('Network Error')) {
      message = '网络连接失败，请检查网络'
    } else if (err.message.includes('could not extract ResultSet')) {
      message = '系统配置错误，请联系管理员'
    }
  }
  
  Message({
    message: message,
    type: 'error',
    duration: 5 * 1000,
    showClose: true
  })
  
  // 关键：总是返回 false，阻止错误传播，防止显示崩溃页面
  // 即使在开发环境也不显示崩溃页面，保持用户友好
  return false
}

/**
 * Promise rejection 错误处理器
 * 捕获未处理的Promise rejection
 */
export function promiseErrorHandler(event) {
  console.error('Unhandled Promise Rejection:', event.reason)
  
  // 阻止显示崩溃页面
  event.preventDefault()
  
  // 防止重复显示错误（request.js中已经处理过的错误）
  if (event.reason && event.reason.message) {
    const errorMsg = event.reason.message
    
    // request.js 已经处理过的错误，不再重复提示
    if (errorMsg.includes('网络错误') || 
        errorMsg.includes('请求失败') || 
        errorMsg.includes('操作失败')) {
      return
    }
    
    // 特殊处理数据库错误
    if (errorMsg.includes('could not extract ResultSet') ||
        errorMsg.includes('SQLGrammarException') ||
        errorMsg.includes('Unknown column')) {
      Message({
        message: '系统配置错误，请联系管理员更新数据库',
        type: 'error',
        duration: 8000,
        showClose: true
      })
      return
    }
  }
  
  // 其他未处理的错误
  Message({
    message: '操作失败，请稍后重试',
    type: 'error',
    duration: 5 * 1000,
    showClose: true
  })
}

/**
 * 全局 JavaScript 错误处理器
 * 捕获其他未捕获的JavaScript错误
 */
export function globalErrorHandler(message, source, lineno, colno, error) {
  console.error('Global Error:', {
    message,
    source,
    lineno,
    colno,
    error
  })
  
  Message({
    message: '系统错误，请刷新页面重试',
    type: 'error',
    duration: 5 * 1000
  })
  
  return true
}

/**
 * 安装全局错误处理器
 */
export function installErrorHandlers(Vue) {
  // Vue 错误处理
  Vue.config.errorHandler = vueErrorHandler
  
  // 未捕获的 Promise rejection
  window.addEventListener('unhandledrejection', promiseErrorHandler)
  
  // 全局 JavaScript 错误
  window.onerror = globalErrorHandler
  
  // 生产环境警告处理
  Vue.config.warnHandler = (msg, vm, trace) => {
    console.warn('Vue Warning:', msg)
    console.warn('Component:', vm)
    console.warn('Trace:', trace)
  }
}

/**
 * 移除错误处理器（用于清理）
 */
export function uninstallErrorHandlers() {
  window.removeEventListener('unhandledrejection', promiseErrorHandler)
  window.onerror = null
}

